﻿/********************************************************************************************
 * Time de desenvolvedores
 *  Vinícius Batista de Souza       @vbs_br
 *  Fermando Martin Figuera         @fernandomartin
 *  
 *  
 * Jogo desenvolvido para testar algumas features e produzir trilha de treinamento no MSDN.
 * Faça o download do SDK do Windows Phone, faça você também o seu jogo :)
 * 
 * Dúvidas utilizem o Forúm do Windows Phone no MSDN.
********************************************************************************************/

using Facebook;
using Microsoft.Phone.Controls;
using System.Collections.Generic;
using System.Windows;
using System;
using System.Windows.Threading;
using System.Windows.Controls;


namespace Helpers
{

    /// <summary>
    /// Classe responsável por conectar com o Facebook, realizar a autenticação e o share
    /// </summary>
    public class FacebookShare
    {
        //ID da aplicação criada no facebook
        public static string AppId = "250979728293343";

        //Lista de permissões que a aplicação precisa.
        private readonly string[] extendedPermissions = new[] { "publish_stream" };

        private FacebookClient fbClient;
        private WebBrowser browserAuth;
        private string shareLink;
        private string descriptionLink;
        private string shareTitle;
        private string shareImage;

        private bool loggedIn = false;

        public Delegate handler;
        public bool isCompleted;

        private DispatcherTimer timeoutTimer;
        public bool timeout = false;


        /// <summary>
        /// Construtor da classe
        /// </summary>
        /// <param name="browser">Instância para o objeto WebBrowser</param>
        /// <param name="link">Link que será utilizado para realizar o compartilhamento</param>
        /// <param name="title">Título que será utilizado no compartilhamento</param>
        /// <param name="description">Descrição utilizada</param>
        /// <param name="image">imagem utilizada</param>
        public FacebookShare(WebBrowser browser, string link, string title, string description, string image)
        {
            browserAuth = browser;
            shareLink = link;
            descriptionLink = description;
            shareTitle = title;
            shareImage = image;
            isCompleted = false;

            timeoutTimer = new DispatcherTimer();
            timeoutTimer.Interval = TimeSpan.FromMilliseconds(4000);
            timeoutTimer.Tick += new EventHandler(timeoutTimer_Tick);


            LoginToFacebook();
        }

        void timeoutTimer_Tick(object sender, EventArgs e)
        {
            timeout = true;
            timeoutTimer.Stop();
        }

        /// <summary>
        /// Configura o ambiente para realizar o login no facebook
        /// </summary>
        private void LoginToFacebook()
        {
            browserAuth.IsScriptEnabled = true;

            browserAuth.Navigated += FacebookLoginBrowser_Navigated;


            var loginParameters = new Dictionary<string, object>
                                      {
                                          { "response_type", "token" },
                                          { "display", "wap" } // by default for wp7 builds only (in Facebook.dll), display is set to touch.
                                      };

            var navigateUrl = FacebookOAuthClient.GetLoginUrl(AppId, null, extendedPermissions, loginParameters);

            timeoutTimer.Start();

            browserAuth.Navigate(navigateUrl);
        }

        private void FacebookLoginBrowser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
        {
            if (timeout) return;

            timeoutTimer.Stop();

            FacebookOAuthResult oauthResult;
            if (FacebookOAuthResult.TryParse(e.Uri, out oauthResult))
            {
                if (oauthResult.IsSuccess)
                {
                    fbClient = new FacebookClient(oauthResult.AccessToken);
                    loggedIn = true;
                    ShareToFacebook();
                }
                else
                {
                    browserAuth.Visibility = Visibility.Collapsed;
                }
            }
            else
            {
                browserAuth.Visibility = Visibility.Visible;
            }
        }

        /// <summary>
        /// Executa o método do facebook para realizar o Share
        /// </summary>
        private void ShareToFacebook()
        {
            if (timeout) return;

            browserAuth.Visibility = System.Windows.Visibility.Collapsed;

            var parameters = new Dictionary<string, object>
                 {
                     {"description", descriptionLink},
                     {"link", shareLink},
                     {"name", shareTitle},
                     {"picture", shareImage}
                 };
            fbClient.PostCompleted += new EventHandler<FacebookApiEventArgs>(fbApp_PostCompleted);
            fbClient.PostAsync("me/feed", parameters);


        }


        /// <summary>
        /// Evento disparado quando completar a chamada do método de 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void fbApp_PostCompleted(object sender, FacebookApiEventArgs e)
        {
            if (timeout) return;

            browserAuth.Navigated -= FacebookLoginBrowser_Navigated;
            isCompleted = true;


        }
    }



}
